import zlib

class Hash:

    # 初始化用字典来模拟圆环,键是crc32加密之后的值, 值是服务器ip
    def __init__(self):

        self.circle = {}



    # 把服务器添加的圆环上
    def add_server(self, server_ip):
        # 通过crc32 对服务器的ip加密
        for i in range(20):
            key = zlib.crc32((server_ip + str(i)).encode())
            self.circle[key] = server_ip



    # 把服务器在圆环上 按照顺时针方向,把key由大到小输出
    @property
    def node(self):
        return dict(sorted(self.circle.items(), key=lambda x:x[0]))


    # 把 name=123 的值 要通过hash存放在 某一台服务器上面
    def search(self, name):
        # 把 name 按照crc32 加密
        name_crc32 = zlib.crc32(name.encode()) # 6000
        print(name_crc32)

        # 判断加密后的值 在 字典的 键的 哪个范围
        # {100: 'a', 1000: 'b', 5000: 'c'}
        for k,v in self.node.items():
            if name_crc32 < k:
                current_server = v
                break
        else:
            current_server = list(self.node.values())[0]

        return current_server


h = Hash()
h.add_server('a')
h.add_server('b')
h.add_server('c')
print(h.node)

print(h.search('uuu'))
